/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package org.ugc.cnel.manabi.jpa;

import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import javax.persistence.Query;
import javax.persistence.EntityNotFoundException;
import org.ugc.cnel.manabi.entidades.Campo;
import org.ugc.cnel.manabi.entidades.Cliente;
import org.ugc.cnel.manabi.entidades.Inspeccion;
import org.ugc.cnel.manabi.entidades.Inspector;
import org.ugc.cnel.manabi.entidades.Liquidador;
import org.ugc.cnel.manabi.entidades.Motivo;
import org.ugc.cnel.manabi.entidades.Novedad;
import org.ugc.cnel.manabi.entidades.Usuario;
import org.ugc.cnel.manabi.entidades.Servicio;
import org.ugc.cnel.manabi.entidades.Adjuntos;
import java.util.ArrayList;
import java.util.Collection;
import org.ugc.cnel.manabi.bakenbeans.AuditBakenBean;
import org.ugc.cnel.manabi.bakenbeans.AuditBakenBean.tipomensaje;
import org.ugc.cnel.manabi.jpa.exceptions.IllegalOrphanException;
import org.ugc.cnel.manabi.jpa.exceptions.NonexistentEntityException;
import org.ugc.cnel.manabi.jpa.exceptions.PreexistingEntityException;

/**
 *
 * @author Admin
 */
public class InspeccionJpaController {

    private Inspeccion inspeccion_guardada;
    public InspeccionJpaController() {
        emf = Persistence.createEntityManagerFactory("UGC_CNELPU");
    }
    private EntityManagerFactory emf = null;

    public EntityManager getEntityManager() {
        return emf.createEntityManager();
    }

    public Inspeccion getInspeccion_guardada() {
        return inspeccion_guardada;
    }

    public void setInspeccion_guardada(Inspeccion inspeccion_guardada) {
        this.inspeccion_guardada = inspeccion_guardada;
    }

    public Inspeccion create(Inspeccion inspeccion) throws PreexistingEntityException {
        if (inspeccion.getAdjuntosCollection() == null) {
            inspeccion.setAdjuntosCollection(new ArrayList<Adjuntos>());
        }
        EntityManager em = null;
        try {
            em = getEntityManager();
            em.getTransaction().begin();
            Integer idAgencia = inspeccion.getIdAgencia();
//            if (idAgencia != null) {
//                idAgencia = em.getReference(idAgencia.getClass(), idAgencia.getId());
//                inspeccion.setIdAgencia(idAgencia);
//            }
            Campo idCampo = inspeccion.getIdCampo();
            if (idCampo != null) {
                idCampo = em.getReference(idCampo.getClass(), idCampo.getId());
                inspeccion.setIdCampo(idCampo);
            }
            Cliente idCliente = inspeccion.getIdCliente();
            if (idCliente != null) {
                idCliente = em.getReference(idCliente.getClass(), idCliente.getId());
                inspeccion.setIdCliente(idCliente);
            }
            Inspector idInspector = inspeccion.getIdInspector();
            if (idInspector != null) {
                idInspector = em.getReference(idInspector.getClass(), idInspector.getId());
                inspeccion.setIdInspector(idInspector);
            }
            Liquidador idLiquidador = inspeccion.getIdLiquidador();
            if (idLiquidador != null) {
                idLiquidador = em.getReference(idLiquidador.getClass(), idLiquidador.getId());
                inspeccion.setIdLiquidador(idLiquidador);
            }
            Motivo idMotivo = inspeccion.getIdMotivo();
            if (idMotivo != null) {
                idMotivo = em.getReference(idMotivo.getClass(), idMotivo.getId());
                inspeccion.setIdMotivo(idMotivo);
            }
            Novedad idNovedad = inspeccion.getIdNovedad();
            if (idNovedad != null) {
                idNovedad = em.getReference(idNovedad.getClass(), idNovedad.getId());
                inspeccion.setIdNovedad(idNovedad);
            }
            Usuario idUsuario = inspeccion.getIdUsuario();
            if (idUsuario != null) {
                idUsuario = em.getReference(idUsuario.getClass(), idUsuario.getId());
                inspeccion.setIdUsuario(idUsuario);
            }
            Servicio idServicio = inspeccion.getIdServicio();
            if (idServicio != null) {
                idServicio = em.getReference(idServicio.getClass(), idServicio.getId());
                inspeccion.setIdServicio(idServicio);
            }
            Collection<Adjuntos> attachedAdjuntosCollection = new ArrayList<Adjuntos>();
            for (Adjuntos adjuntosCollectionAdjuntosToAttach : inspeccion.getAdjuntosCollection()) {
                adjuntosCollectionAdjuntosToAttach = em.getReference(adjuntosCollectionAdjuntosToAttach.getClass(), adjuntosCollectionAdjuntosToAttach.getId());
                attachedAdjuntosCollection.add(adjuntosCollectionAdjuntosToAttach);
            }
            inspeccion.setAdjuntosCollection(attachedAdjuntosCollection);
            em.persist(inspeccion);
//            if (idAgencia != null) {
//                idAgencia.getInspeccionCollection().add(inspeccion);
//                idAgencia = em.merge(idAgencia);
//            }
            if (idCampo != null) {
                idCampo.getInspeccionCollection().add(inspeccion);
                idCampo = em.merge(idCampo);
            }
            if (idCliente != null) {
                idCliente.getInspeccionCollection().add(inspeccion);
                idCliente = em.merge(idCliente);
            }
            if (idInspector != null) {
                idInspector.getInspeccionCollection().add(inspeccion);
                idInspector = em.merge(idInspector);
            }
            if (idLiquidador != null) {
                idLiquidador.getInspeccionCollection().add(inspeccion);
                idLiquidador = em.merge(idLiquidador);
            }
            if (idMotivo != null) {
                idMotivo.getInspeccionCollection().add(inspeccion);
                idMotivo = em.merge(idMotivo);
            }
            if (idNovedad != null) {
                idNovedad.getInspeccionCollection().add(inspeccion);
                idNovedad = em.merge(idNovedad);
            }
            if (idUsuario != null) {
                idUsuario.getInspeccionCollection().add(inspeccion);
                idUsuario = em.merge(idUsuario);
            }
            if (idServicio != null) {
                idServicio.getInspeccionCollection().add(inspeccion);
                idServicio = em.merge(idServicio);
            }
            for (Adjuntos adjuntosCollectionAdjuntos : inspeccion.getAdjuntosCollection()) {
                Inspeccion oldIdInspeccionOfAdjuntosCollectionAdjuntos = adjuntosCollectionAdjuntos.getIdInspeccion();
                adjuntosCollectionAdjuntos.setIdInspeccion(inspeccion);
                adjuntosCollectionAdjuntos = em.merge(adjuntosCollectionAdjuntos);
                if (oldIdInspeccionOfAdjuntosCollectionAdjuntos != null) {
                    oldIdInspeccionOfAdjuntosCollectionAdjuntos.getAdjuntosCollection().remove(adjuntosCollectionAdjuntos);
                    oldIdInspeccionOfAdjuntosCollectionAdjuntos = em.merge(oldIdInspeccionOfAdjuntosCollectionAdjuntos);
                }
            }

            em.getTransaction().commit();
            AuditBakenBean.audit(tipomensaje.CREAR, "Creo una inspeccion{" + inspeccion + "}");
            this.inspeccion_guardada=inspeccion;
            return inspeccion;
            
        } catch (Exception ex) {
            if (findInspeccion(inspeccion.getId()) != null) {
                throw new PreexistingEntityException("Inspeccion " + inspeccion + " already exists.", ex);
            }
            try {
                throw ex;
            } catch (Exception ex1) {
                Logger.getLogger(InspeccionJpaController.class.getName()).log(Level.SEVERE, null, ex1);
            }
        } finally {
            if (em != null) {
                em.close();
            }
        }
        return null;
    }

    public void edit(Inspeccion inspeccion) throws IllegalOrphanException, NonexistentEntityException, Exception {
        EntityManager em = null;
        try {
            em = getEntityManager();
            em.getTransaction().begin();
            Inspeccion persistentInspeccion = em.find(Inspeccion.class, inspeccion.getId());
            //Agencia idAgenciaOld = persistentInspeccion.getIdAgencia();
            //Agencia idAgenciaNew = inspeccion.getIdAgencia();
            Campo idCampoOld = persistentInspeccion.getIdCampo();
            Campo idCampoNew = inspeccion.getIdCampo();
            Cliente idClienteOld = persistentInspeccion.getIdCliente();
            Cliente idClienteNew = inspeccion.getIdCliente();
            Inspector idInspectorOld = persistentInspeccion.getIdInspector();
            Inspector idInspectorNew = inspeccion.getIdInspector();
            Liquidador idLiquidadorOld = persistentInspeccion.getIdLiquidador();
            Liquidador idLiquidadorNew = inspeccion.getIdLiquidador();
            Motivo idMotivoOld = persistentInspeccion.getIdMotivo();
            Motivo idMotivoNew = inspeccion.getIdMotivo();
            Novedad idNovedadOld = persistentInspeccion.getIdNovedad();
            Novedad idNovedadNew = inspeccion.getIdNovedad();
            Usuario idUsuarioOld = persistentInspeccion.getIdUsuario();
            Usuario idUsuarioNew = inspeccion.getIdUsuario();
            Servicio idServicioOld = persistentInspeccion.getIdServicio();
            Servicio idServicioNew = inspeccion.getIdServicio();
            Collection<Adjuntos> adjuntosCollectionOld = persistentInspeccion.getAdjuntosCollection();
            Collection<Adjuntos> adjuntosCollectionNew = inspeccion.getAdjuntosCollection();
            List<String> illegalOrphanMessages = null;
            for (Adjuntos adjuntosCollectionOldAdjuntos : adjuntosCollectionOld) {
                if (!adjuntosCollectionNew.contains(adjuntosCollectionOldAdjuntos)) {
                    if (illegalOrphanMessages == null) {
                        illegalOrphanMessages = new ArrayList<String>();
                    }
                    illegalOrphanMessages.add("You must retain Adjuntos " + adjuntosCollectionOldAdjuntos + " since its idInspeccion field is not nullable.");
                }
            }
            if (illegalOrphanMessages != null) {
                throw new IllegalOrphanException(illegalOrphanMessages);
            }
//            if (idAgenciaNew != null) {
//                idAgenciaNew = em.getReference(idAgenciaNew.getClass(), idAgenciaNew.getId());
//                inspeccion.setIdAgencia(idAgenciaNew);
//            }
            if (idCampoNew != null) {
                idCampoNew = em.getReference(idCampoNew.getClass(), idCampoNew.getId());
                inspeccion.setIdCampo(idCampoNew);
            }
            if (idClienteNew != null) {
                idClienteNew = em.getReference(idClienteNew.getClass(), idClienteNew.getId());
                inspeccion.setIdCliente(idClienteNew);
            }
            if (idInspectorNew != null) {
                idInspectorNew = em.getReference(idInspectorNew.getClass(), idInspectorNew.getId());
                inspeccion.setIdInspector(idInspectorNew);
            }
            if (idLiquidadorNew != null) {
                idLiquidadorNew = em.getReference(idLiquidadorNew.getClass(), idLiquidadorNew.getId());
                inspeccion.setIdLiquidador(idLiquidadorNew);
            }
            if (idMotivoNew != null) {
                idMotivoNew = em.getReference(idMotivoNew.getClass(), idMotivoNew.getId());
                inspeccion.setIdMotivo(idMotivoNew);
            }
            if (idNovedadNew != null) {
                idNovedadNew = em.getReference(idNovedadNew.getClass(), idNovedadNew.getId());
                inspeccion.setIdNovedad(idNovedadNew);
            }
            if (idUsuarioNew != null) {
                idUsuarioNew = em.getReference(idUsuarioNew.getClass(), idUsuarioNew.getId());
                inspeccion.setIdUsuario(idUsuarioNew);
            }
            if (idServicioNew != null) {
                idServicioNew = em.getReference(idServicioNew.getClass(), idServicioNew.getId());
                inspeccion.setIdServicio(idServicioNew);
            }
            Collection<Adjuntos> attachedAdjuntosCollectionNew = new ArrayList<Adjuntos>();
            for (Adjuntos adjuntosCollectionNewAdjuntosToAttach : adjuntosCollectionNew) {
                adjuntosCollectionNewAdjuntosToAttach = em.getReference(adjuntosCollectionNewAdjuntosToAttach.getClass(), adjuntosCollectionNewAdjuntosToAttach.getId());
                attachedAdjuntosCollectionNew.add(adjuntosCollectionNewAdjuntosToAttach);
            }
            adjuntosCollectionNew = attachedAdjuntosCollectionNew;
            inspeccion.setAdjuntosCollection(adjuntosCollectionNew);
            inspeccion = em.merge(inspeccion);
//            if (idAgenciaOld != null && !idAgenciaOld.equals(idAgenciaNew)) {
//                idAgenciaOld.getInspeccionCollection().remove(inspeccion);
//                idAgenciaOld = em.merge(idAgenciaOld);
//            }
//            if (idAgenciaNew != null && !idAgenciaNew.equals(idAgenciaOld)) {
//                idAgenciaNew.getInspeccionCollection().add(inspeccion);
//                idAgenciaNew = em.merge(idAgenciaNew);
//            }
            if (idCampoOld != null && !idCampoOld.equals(idCampoNew)) {
                idCampoOld.getInspeccionCollection().remove(inspeccion);
                idCampoOld = em.merge(idCampoOld);
            }
            if (idCampoNew != null && !idCampoNew.equals(idCampoOld)) {
                idCampoNew.getInspeccionCollection().add(inspeccion);
                idCampoNew = em.merge(idCampoNew);
            }
            if (idClienteOld != null && !idClienteOld.equals(idClienteNew)) {
                idClienteOld.getInspeccionCollection().remove(inspeccion);
                idClienteOld = em.merge(idClienteOld);
            }
            if (idClienteNew != null && !idClienteNew.equals(idClienteOld)) {
                idClienteNew.getInspeccionCollection().add(inspeccion);
                idClienteNew = em.merge(idClienteNew);
            }
            if (idInspectorOld != null && !idInspectorOld.equals(idInspectorNew)) {
                idInspectorOld.getInspeccionCollection().remove(inspeccion);
                idInspectorOld = em.merge(idInspectorOld);
            }
            if (idInspectorNew != null && !idInspectorNew.equals(idInspectorOld)) {
                idInspectorNew.getInspeccionCollection().add(inspeccion);
                idInspectorNew = em.merge(idInspectorNew);
            }
            if (idLiquidadorOld != null && !idLiquidadorOld.equals(idLiquidadorNew)) {
                idLiquidadorOld.getInspeccionCollection().remove(inspeccion);
                idLiquidadorOld = em.merge(idLiquidadorOld);
            }
            if (idLiquidadorNew != null && !idLiquidadorNew.equals(idLiquidadorOld)) {
                idLiquidadorNew.getInspeccionCollection().add(inspeccion);
                idLiquidadorNew = em.merge(idLiquidadorNew);
            }
            if (idMotivoOld != null && !idMotivoOld.equals(idMotivoNew)) {
                idMotivoOld.getInspeccionCollection().remove(inspeccion);
                idMotivoOld = em.merge(idMotivoOld);
            }
            if (idMotivoNew != null && !idMotivoNew.equals(idMotivoOld)) {
                idMotivoNew.getInspeccionCollection().add(inspeccion);
                idMotivoNew = em.merge(idMotivoNew);
            }
            if (idNovedadOld != null && !idNovedadOld.equals(idNovedadNew)) {
                idNovedadOld.getInspeccionCollection().remove(inspeccion);
                idNovedadOld = em.merge(idNovedadOld);
            }
            if (idNovedadNew != null && !idNovedadNew.equals(idNovedadOld)) {
                idNovedadNew.getInspeccionCollection().add(inspeccion);
                idNovedadNew = em.merge(idNovedadNew);
            }
            if (idUsuarioOld != null && !idUsuarioOld.equals(idUsuarioNew)) {
                idUsuarioOld.getInspeccionCollection().remove(inspeccion);
                idUsuarioOld = em.merge(idUsuarioOld);
            }
            if (idUsuarioNew != null && !idUsuarioNew.equals(idUsuarioOld)) {
                idUsuarioNew.getInspeccionCollection().add(inspeccion);
                idUsuarioNew = em.merge(idUsuarioNew);
            }
            if (idServicioOld != null && !idServicioOld.equals(idServicioNew)) {
                idServicioOld.getInspeccionCollection().remove(inspeccion);
                idServicioOld = em.merge(idServicioOld);
            }
            if (idServicioNew != null && !idServicioNew.equals(idServicioOld)) {
                idServicioNew.getInspeccionCollection().add(inspeccion);
                idServicioNew = em.merge(idServicioNew);
            }
            for (Adjuntos adjuntosCollectionNewAdjuntos : adjuntosCollectionNew) {
                if (!adjuntosCollectionOld.contains(adjuntosCollectionNewAdjuntos)) {
                    Inspeccion oldIdInspeccionOfAdjuntosCollectionNewAdjuntos = adjuntosCollectionNewAdjuntos.getIdInspeccion();
                    adjuntosCollectionNewAdjuntos.setIdInspeccion(inspeccion);
                    adjuntosCollectionNewAdjuntos = em.merge(adjuntosCollectionNewAdjuntos);
                    if (oldIdInspeccionOfAdjuntosCollectionNewAdjuntos != null && !oldIdInspeccionOfAdjuntosCollectionNewAdjuntos.equals(inspeccion)) {
                        oldIdInspeccionOfAdjuntosCollectionNewAdjuntos.getAdjuntosCollection().remove(adjuntosCollectionNewAdjuntos);
                        oldIdInspeccionOfAdjuntosCollectionNewAdjuntos = em.merge(oldIdInspeccionOfAdjuntosCollectionNewAdjuntos);
                    }
                }
            }
            em.getTransaction().commit();
            AuditBakenBean.audit(tipomensaje.EDITAR, "Edito la inspeccion {" + inspeccion + "}");
        } catch (Exception ex) {
            String msg = ex.getLocalizedMessage();
            if (msg == null || msg.length() == 0) {
                Integer id = inspeccion.getId();
                if (findInspeccion(id) == null) {
                    throw new NonexistentEntityException("The inspeccion with id " + id + " no longer exists.");
                }
            }
            throw ex;
        } finally {
            if (em != null) {
                em.close();
            }
        }
    }

    public void destroy(Integer id) throws IllegalOrphanException, NonexistentEntityException {
        EntityManager em = null;
        try {
            em = getEntityManager();
            em.getTransaction().begin();
            Inspeccion inspeccion;
            try {
                inspeccion = em.getReference(Inspeccion.class, id);
                inspeccion.getId();
            } catch (EntityNotFoundException enfe) {
                throw new NonexistentEntityException("The inspeccion with id " + id + " no longer exists.", enfe);
            }
            List<String> illegalOrphanMessages = null;
            Collection<Adjuntos> adjuntosCollectionOrphanCheck = inspeccion.getAdjuntosCollection();
            for (Adjuntos adjuntosCollectionOrphanCheckAdjuntos : adjuntosCollectionOrphanCheck) {
                if (illegalOrphanMessages == null) {
                    illegalOrphanMessages = new ArrayList<String>();
                }
                illegalOrphanMessages.add("This Inspeccion (" + inspeccion + ") cannot be destroyed since the Adjuntos " + adjuntosCollectionOrphanCheckAdjuntos + " in its adjuntosCollection field has a non-nullable idInspeccion field.");
            }
            if (illegalOrphanMessages != null) {
                throw new IllegalOrphanException(illegalOrphanMessages);
            }
            Integer idAgencia = inspeccion.getIdAgencia();
//            if (idAgencia != null) {
//                idAgencia.getInspeccionCollection().remove(inspeccion);
//                idAgencia = em.merge(idAgencia);
//            }
            Campo idCampo = inspeccion.getIdCampo();
            if (idCampo != null) {
                idCampo.getInspeccionCollection().remove(inspeccion);
                idCampo = em.merge(idCampo);
            }
            Cliente idCliente = inspeccion.getIdCliente();
            if (idCliente != null) {
                idCliente.getInspeccionCollection().remove(inspeccion);
                idCliente = em.merge(idCliente);
            }
            Inspector idInspector = inspeccion.getIdInspector();
            if (idInspector != null) {
                idInspector.getInspeccionCollection().remove(inspeccion);
                idInspector = em.merge(idInspector);
            }
            Liquidador idLiquidador = inspeccion.getIdLiquidador();
            if (idLiquidador != null) {
                idLiquidador.getInspeccionCollection().remove(inspeccion);
                idLiquidador = em.merge(idLiquidador);
            }
            Motivo idMotivo = inspeccion.getIdMotivo();
            if (idMotivo != null) {
                idMotivo.getInspeccionCollection().remove(inspeccion);
                idMotivo = em.merge(idMotivo);
            }
            Novedad idNovedad = inspeccion.getIdNovedad();
            if (idNovedad != null) {
                idNovedad.getInspeccionCollection().remove(inspeccion);
                idNovedad = em.merge(idNovedad);
            }
            Usuario idUsuario = inspeccion.getIdUsuario();
            if (idUsuario != null) {
                idUsuario.getInspeccionCollection().remove(inspeccion);
                idUsuario = em.merge(idUsuario);
            }
            Servicio idServicio = inspeccion.getIdServicio();
            if (idServicio != null) {
                idServicio.getInspeccionCollection().remove(inspeccion);
                idServicio = em.merge(idServicio);
            }
            em.remove(inspeccion);
            em.getTransaction().commit();
            AuditBakenBean.audit(tipomensaje.ELIMINAR, "Elimino la inspeccion {" + inspeccion + "}");
        } finally {
            if (em != null) {
                em.close();
            }
        }
    }

    public List<Inspeccion> findInspeccionEntities() {
        return findInspeccionEntities(true, -1, -1);
    }

    public List<Inspeccion> findInspeccionEntities(int maxResults, int firstResult) {
        return findInspeccionEntities(false, maxResults, firstResult);
    }

    private List<Inspeccion> findInspeccionEntities(boolean all, int maxResults, int firstResult) {
        EntityManager em = getEntityManager();
        try {
            Query q = em.createQuery("select object(o) from Inspeccion as o order by o.id desc");
            if (!all) {
                q.setMaxResults(maxResults);
                q.setFirstResult(firstResult);
            }
            return    q.getResultList();
        } finally {
            em.close();
        }
    }

    public Inspeccion findInspeccion(Integer id) {
        EntityManager em = getEntityManager();
        try {
            return em.find(Inspeccion.class, id);
        } finally {
            em.close();
        }
    }

    public int getInspeccionCount() {
        EntityManager em = getEntityManager();
        try {
            return ((Long) em.createQuery("select count(o) from Inspeccion as o").getSingleResult()).intValue();
        } finally {
            em.close();
        }
    }
}
